package com.cee.admin.common.utils;



import com.cee.common.core.domain.BaseEntity;
import com.cee.common.core.service.BasicService;
import com.cee.common.lang.ClassGenericUtil;
import com.cee.common.spring.SpringContextHolder;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 基础 api 工具类
 *
 * @author rxliuli
 */
public class BaseApiUtils {
    /**
     * 获取到泛型类上的 Service {@link Class} 对象
     *
     * @param clazz 当前运行的 class 类型对象（子类对象类型）
     * @param <S>   服务类类型
     * @param <E>   实体类类型
     * @return 服务类的 Bean 实例
     */
    public static <S extends BasicService<E>, E extends BaseEntity> Optional<S> getGenericClassService(Class<?> clazz, Class<?> interfaceClazz) {
        final Map<Class<?>, List<Class<?>>> map = ClassGenericUtil.getInterfaceTypeParamsForRecursive(clazz);
        return map.getOrDefault(interfaceClazz, Collections.emptyList()).stream()
            .filter(BasicService.class::isAssignableFrom)
            .findFirst()
            .map(SpringContextHolder::getBean)
            .map(service -> (S) service);
    }

    /**
     * 获取到泛型类上的 Entity {@link Class} 对象
     *
     * @param clazz 当前运行的 class 类型对象（子类对象类型）
     * @param <S>   服务类类型
     * @param <E>   实体类类型
     * @return 实体类的 Bean 实例
     */
    public static <S extends BasicService<E>, E extends BaseEntity> Optional<S> getGenericClassEntity(Class<?> clazz, Class<?> interfaceClazz) {
        final Map<Class<?>, List<Class<?>>> map = ClassGenericUtil.getInterfaceTypeParamsForRecursive(clazz);
        return map.getOrDefault(interfaceClazz, Collections.emptyList()).stream()
            .filter(BaseEntity.class::isAssignableFrom)
            .findFirst()
            .map(SpringContextHolder::getBean)
            .map(service -> (S) service);
    }
}
